SQL Serverのメモリ管理の概要~管理コンポーネントと管理方法~
引用元
https://gyazo.com/53671da65807b29e83d83d54d3176b56
SQL Serverにおけるメモリ管理方法, 論理的なメモリ管理区分や, SQL Server自体のタスクへのメモリリソース割当方法についてざっくり説明する. 加えて, OLTPに特化したインメモリアーキテクチャの概要について説明する. 第三章メモリ管理, 第7章OLTPがそれぞれの該当箇所である.
公式ドキュメント: メモリ管理アーキテクチャ ガイド https://docs.microsoft.com/ja-jp/sql/relational-databases/memory-management-architecture-guide?view=sql-server-ver15
--.icon
WindowsOS上で動作するアプリケーション(プロセス)は, それぞれが仮想アドレス空間を保持
実際に物理アドレスが割り当てられているわけではない. ちなみに仮想アドレス空間とは, プログラム/アプリケーションから見たときの論理的なメモリ領域である. ちなみに, SQL Serverはデフォルトで利用メモリサイズを取れるだけ取ろうとする設定がされている.
類似したワードで, 仮想メモリがある. 仮想メモリは, 物理メモリ(RAM)だけでなくてSWAPfileを活用してメモリ領域を拡張した仕組みである.
仮想メモリアドレスは大きく3つの領域で認識される.
Committed ... 実際に物理メモリを割り当てている状態, 領域
Reserved ... 物理メモリの割当はしておらず, 仮想メモリ内の予約をしている状態, 領域
Free ... 自由に仮想メモリの割当が可能な状態, 領域
https://gyazo.com/cffe1a287ed19065fed37b240c0200a9
メモリ不足時のページング
複数プロセスがそれぞれの仮想アドレス空間を持ち合わせており, 各プロセス時には物理メモリを利用して処理をする. メモリが不足してしまうことがある. その場合, 物理メモリを占有しているデータのうち, 不要とOSが判断したモノをDisk側のページファイルへ書き込み退避させて, 物理メモリに余裕を作り出す. 退避ファイルは必要となったタイミングでメモリに戻してあげる. この一連の処理をページングという.
memoryのアーキテクチャ ~Non-Uniform Memory Architecture~
SMP( Symmetric Multiprocessing )では全CPUがメモリ, コントローラ, バスを共有するので問題があった
https://gyazo.com/435183e60d74e5be4d53bb2d6a2f2e96
https://en.wikipedia.org/wiki/Symmetric_multiprocessing#:~:text=Symmetric%20multiprocessing%20(SMP)%20involves%20a,system%20instance%20that%20treats%20all
NUMA( Non-Uniform Memory Architecture )ではCPUクラスタごとにローカルmemoryを付与することで解決を図った.
https://gyazo.com/adab1693376dde25bb526ff9d6d53b66
https://en.wikipedia.org/wiki/Non-uniform_memory_access#:~:text=Non-uniform%20memory%20access%20(NUMA,location%20relative%20to%20the%20processor.
SQL Serverのメモリ割り当て機構と仕組み
Workspace内のメモリ割当方法には, 直接割当方法と, Fragment(予約領域)からの割当方法の2つが存在する. 各ユースケースは不明だけど, おそらくメモリ足りない場合などに予約領域を活用すると想定される.
https://gyazo.com/ebedc86f4a5c71fa88257b52ac214bfa
メモリの用途
Buffer Pool, Buffer Cache ... データページやインデックスページをDiskから読み込んで展開する領域. ハッシュアルゴリズムを用いて, キャッシュ内検索効率を上げている.
Plan Cache ... コンパイル後のクエリ実行計画の保存
Query Workspace ... 結果セットの並び替えなどに利用. tempdbデータベースが利用されることもある.
Global領域 ... ロック用メモリ, レプリケーション作業用メモリ, Queryテキスト格納用メモリ
Buffer Pool/Cacheとは異なるメモリ利用~インメモリOLTP~
インメモリOLTPの特徴
Diskとmemoryのデータのやり取り分, オーバーヘッドが発生してしまう. リアルタイム性が高く求められる処理においてはメモリ上に直接データを展開して, Memory上のみでCRUDを完結させるアーキテクチャ, Componentが準備されている.
インメモリOLTP(OnLingTransactionProcess)と呼ばれる. Buffer Poolとは全く別のMemory領域を使用し, SQL Serverが起動する度に, インデックスは作成されてMemory loadされる. Disk ⇔ MemoryのI/O操作を削減することが可能. ストアドプロシジャも初回実行時にコンパイルしてからは, 当Memory上に配置され再利用されることになる.
MemoryデータはSQL Serverを再起動したら, 消失するので再度ロードが必要である. データ永続化のオプションとしてデータベースバックアップの対象に含めておくことも可能.
スループット向上のために, Disk上のデータ保護のためのロック, ラッチの仕組みを用いずにデータ更新を実現している. P177
他Componentとの関係性
インメモリOLTPは, 大量の小規模処理の効率処理に特化した機能であり, IoTやTempTableとして活用されている. またETLの中間テーブルとしても活用されている.
https://gyazo.com/e2ba9c16389e89bbbc7d37a512dc62f3
https://thinkit.co.jp/article/10063?page=0%2C1
データ実体
Diskファイルと異なり, ページやエクステントという概念はない. データ管理としては, データから作成したハッシュ値をMemoryアドレスに紐付けて管理している. 行ヘッダーとペイロードの2種類の情報からデータは構成される.インデックスポインタに実際のデータ値が対応する.
https://gyazo.com/8048ee49f2d3cce3a08eab2f9c51fb5e
GC: Grabage Collectionのロジック
Garbase Collection Main methodというSQL ServerのComponentが担っている. 以下がその挙動である. GCの起動トリガーは①1min毎のスケジューリング, ②Memory逼迫検知, ③各ユーザートランザクション処理時となっている.
https://gyazo.com/9fea74217c6df59541e585893a0a81c1
memory領域におけるモニタリング方法
利用ツールとして, 動的ビュー( sys.dm_os_memory_clerks )を参照することが可能
実行コマンド
code:sql
SELECT * FROM sys.dm_os_memory_clerks GROUP BY type ORDER BY sum(pages_kb) DESC;
P78に詳細あり...!!
#Database #Azure #SQLServer